package com.itheima.demo8;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class MyReflectDemo4 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {

        //获取class字节码文件对象
        Class clazz = Class.forName("com.itheima.demo8.Student");

        //获取所有公开的方法对象（包含父类中所有的公共方法）
      /*  Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }*/

        //获取所有的方法（可以获取私有的，但不能获取父类的）
      /*  Method[] declaredMethods = clazz.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println(declaredMethod);
        }*/

        //获取指定的单个的方法（私有的也可以获取）
        //参数一：方法名
        //参数二：方法的形参类型的class格式
        Method name = clazz.getDeclaredMethod("eat", String.class);
        System.out.println(name);

        //获取方法的修饰符
        int modifiers = name.getModifiers();
        System.out.println(modifiers);

        //获取方法的名字
        String s = name.getName();
        System.out.println(s);

        //获取方法的形参
        Parameter[] parameters = name.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }

        //获取方法抛出的异常
        Class<?>[] exceptionTypes = name.getExceptionTypes();
        for (Class<?> exceptionType : exceptionTypes) {
            System.out.println(exceptionType);
        }

        //方法运行
        Student student = new Student();

        //暴力反射
        name.setAccessible(true);

        //参数一：方法的调用者
        //参数二：传递给方法的实际参数
        String result = (String) name.invoke(student, "汉堡包");

        System.out.println(result);

    }
}
